package com.anan.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * 用于配置 RedisTemplate 的序列化方式的。它的作用是将 Redis 中的 key 和 value 进行序列化和反序列化，以便存储和读取 Java 对象。
 * @param <V>
 */
@Configuration("redisConfig")  // 表示将该类标识为配置类，并指定了一个名称为 "redisConfig"；
public class RedisConfig<V> {

    @Bean  // 表示将该方法返回的对象交给 Spring 容器管理;  RedisTemplate<String, V> 表示 RedisTemplate 的泛型类型，其中 String 表示 key 的类型，V 表示 value 的类型；
    public RedisTemplate<String, V> redisTemplate(RedisConnectionFactory factory) {  // RedisConnectionFactory factory 表示 Redis 连接工厂，由 Spring 自动注入
        RedisTemplate<String, V> template = new RedisTemplate<>();  // RedisTemplate 对象
        template.setConnectionFactory(factory);  // 这段代码是用于设置 RedisTemplate 的连接工厂的。它的作用是将 RedisTemplate 与 RedisConnectionFactory 关联起来，以便进行连接和操作 Redis 数据库。
        // 设置key的序列化方式
        template.setKeySerializer(RedisSerializer.string());  //  表示设置 key 的序列化方式为 StringRedisSerializer，即将 key 序列化为字符串
        // 设置value的序列化方式
        template.setValueSerializer(RedisSerializer.json());  // 表示设置 value 的序列化方式为 Jackson2JsonRedisSerializer，即将 value 序列化为 JSON 字符串；
        // 设置hash的key的序列化方式
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置hash的value的序列化方式
        template.setHashValueSerializer(RedisSerializer.json());
        template.afterPropertiesSet();  // 表示初始化 RedisTemplate 对象。
        return template;
    }
}
